#ifndef Root_H
#define Root_H

#include "structs.h"
class Node;

#include <QObject>

#include <QDebug>

class Root : public QObject
{
    Q_OBJECT
protected:
    Node* root;

public:
    Root() { root = NULL; }
    void set_root (Node* old_root, Node* new_root)
    {
        // убеждаемся, что корень, который только что был изменен пренадлежит данному дереву.
        if (old_root != root)  throw "wrong old_root in Root::set_root";
        else root = new_root;
    }

    Node* get_root () { return root; }

    virtual ~Root ()
    {
        if (root) {
            root->delete_all_subtrees();
            delete root;
        }
    }

public slots:
    void nodeCreatedHandler(Node* node)
    {
        emit nodeCreated(node);
    }

    void nodeChangedHandler(Node* node)
    {
        emit nodeChanged(node);
    }

    void fatherChangedHandler(Node* node)
    {
        emit fatherChanged(node);
    }

    void nodeDestroyedHandler(Node* node)
    {
        emit nodeDestroyed(node);
    }

signals:
    void nodeCreated(Node* node);
    void nodeChanged(Node* node);
    void fatherChanged(Node* node);
    void nodeDestroyed(Node* node);
};
#endif // Root_H
